package com.lmk.ms.common.dto.es;

import co.elastic.clients.json.JsonData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.util.List;

/**
 * ES搜索字段参数
 * @author laomake@hotmail.com
 * @version 1.0
 * @date 2023/9/8
 */
@Data
@Schema(description = "字段匹配参数")
public class EsFieldSearchParameter {

    @Schema(description = "数据类型")
    private EsFieldDataType dataType;

    @Schema(description = "匹配类型")
    private EsFieldSearchType searchType;

    @Schema(description = "是否高亮")
    private Boolean highlight = false;

    @Schema(description = "字段名称")
    private String name;

    @Schema(description = "匹配值")
    private JsonData value;

    @Schema(description = "匹配值列表")
    private List<JsonData> values;

    @Schema(description = "起始值")
    private JsonData from;

    @Schema(description = "截至值")
    private JsonData to;

    /**
     * 是否存在某个字段
     * @param name  字段名
     * @param mustExist 是否要求存在
     * @return
     */
    public static EsFieldSearchParameter exist(String name, Boolean mustExist){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setSearchType(EsFieldSearchType.exist);
        parameter.setName(name);
        parameter.setValue(JsonData.of(mustExist));
        return parameter;
    }

    /**
     * 单个文本精准匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter textTerm(String name, String value){
        return textTerm(name, value, false);
    }

    /**
     * 单个文本精准匹配
     * @param name
     * @param value
     * @param highlight
     * @return
     */
    public static EsFieldSearchParameter textTerm(String name, String value, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.term);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 多个文本精准匹配
     * @param name
     * @param values
     * @return
     */
    public static EsFieldSearchParameter textTerms(String name, List<String> values){
        return textTerms(name, values, false);
    }

    public static EsFieldSearchParameter textTerms(String name, List<String> values, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.terms);
        parameter.setName(name);
        parameter.setValue(JsonData.of(values));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 文本分词匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter match(String name, String value){
        return match(name, value, false);
    }

    public static EsFieldSearchParameter match(String name, String value, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.match);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 文本短语匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter matchPhrase(String name, String value){
        return matchPhrase(name, value, false);
    }

    public static EsFieldSearchParameter matchPhrase(String name, String value, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.matchPhrase);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 文本前缀匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter startWith(String name, String value){
        return startWith(name, value, false);
    }

    public static EsFieldSearchParameter startWith(String name, String value, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.startWith);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 文本后缀匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter endWith(String name, String value){
        return endWith(name, value, false);
    }

    public static EsFieldSearchParameter endWith(String name, String value, boolean highlight){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.text);
        parameter.setSearchType(EsFieldSearchType.endWith);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        parameter.setHighlight(highlight);
        return parameter;
    }

    /**
     * 单个整型值匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter intTerm(String name, Integer value){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.integer);
        parameter.setSearchType(EsFieldSearchType.term);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        return parameter;
    }

    /**
     * 多个整型值匹配
     * @param name
     * @param values
     * @return
     */
    public static EsFieldSearchParameter intTerms(String name, List<Integer> values){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.integer);
        parameter.setSearchType(EsFieldSearchType.terms);
        parameter.setName(name);
        parameter.setValue(JsonData.of(values));
        return parameter;
    }

    /**
     * 整型值范围匹配
     * @param name
     * @param from
     * @param to
     * @return
     */
    public static EsFieldSearchParameter intRange(String name, Integer from, Integer to){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.integer);
        parameter.setSearchType(EsFieldSearchType.range);
        parameter.setName(name);
        parameter.setFrom(JsonData.of(from));
        parameter.setTo(JsonData.of(to));
        return parameter;
    }

    /**
     * 单个长整型值匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter longTerm(String name, Long value){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.bigInteger);
        parameter.setSearchType(EsFieldSearchType.term);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        return parameter;
    }

    /**
     * 多个长整型值匹配
     * @param name
     * @param values
     * @return
     */
    public static EsFieldSearchParameter longTerms(String name, List<Long> values){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.bigInteger);
        parameter.setSearchType(EsFieldSearchType.terms);
        parameter.setName(name);
        parameter.setValue(JsonData.of(values));
        return parameter;
    }

    /**
     * 长整型值范围匹配
     * @param name
     * @param from
     * @param to
     * @return
     */
    public static EsFieldSearchParameter longRange(String name, Long from, Long to){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.bigInteger);
        parameter.setSearchType(EsFieldSearchType.range);
        parameter.setName(name);
        parameter.setFrom(JsonData.of(from));
        parameter.setTo(JsonData.of(to));
        return parameter;
    }

    /**
     * 单个浮点型值匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter decimalTerm(String name, Double value){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.decimal);
        parameter.setSearchType(EsFieldSearchType.term);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        return parameter;
    }

    /**
     * 多个浮点型值匹配
     * @param name
     * @param values
     * @return
     */
    public static EsFieldSearchParameter decimalTerms(String name, List<Double> values){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.decimal);
        parameter.setSearchType(EsFieldSearchType.terms);
        parameter.setName(name);
        parameter.setValue(JsonData.of(values));
        return parameter;
    }

    /**
     * 浮点型值范围匹配
     * @param name
     * @param from
     * @param to
     * @return
     */
    public static EsFieldSearchParameter decimalRange(String name, Double from, Double to){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.decimal);
        parameter.setSearchType(EsFieldSearchType.range);
        parameter.setName(name);
        parameter.setFrom(JsonData.of(from));
        parameter.setTo(JsonData.of(to));
        return parameter;
    }

    /**
     * 布尔值匹配
     * @param name
     * @param value
     * @return
     */
    public static EsFieldSearchParameter boolTerm(String name, Boolean value){
        EsFieldSearchParameter parameter = new EsFieldSearchParameter();
        parameter.setDataType(EsFieldDataType.bool);
        parameter.setSearchType(EsFieldSearchType.term);
        parameter.setName(name);
        parameter.setValue(JsonData.of(value));
        return parameter;
    }
}
